import {
    getConfig,
    getWeeklyResetTracking,
    performWeeklyReset,
    shouldPerformWeeklyReset,
    getWeekNumber,
    checkPermission,
    getLastWeekRankingHistory,
    formatRankingMessage
} from '../function/function.js';

export class WeeklyReset extends plugin {
    constructor() {
        super({
            name: '[Sm]每周重置',
            dsc: '每周重置存档系统',
            event: 'message',
            priority: 1,
            rule: [
                { reg: /^[#\/]奴隶重置状态$/, fnc: 'resetStatus' },
                { reg: /^[#\/]手动奴隶重置$/, fnc: 'manualReset' },
                { reg: /^[#\/]奴隶重置帮助$/, fnc: 'resetHelp' },
                { reg: /^[#\/]上周排行榜$/, fnc: 'lastWeekRanking' }
            ]
        })
    }

    // 查看重置状态
    async resetStatus(e) {
        try {
            const config = getConfig();
            const tracking = getWeeklyResetTracking();
            const currentDate = new Date();
            const currentWeek = getWeekNumber(currentDate);
            
            if (!config.weeklyReset || !config.weeklyReset.enabled) {
                return e.reply(['每周重置功能未启用']);
            }

            const resetTime = config.weeklyReset.resetTime;
            const dayNames = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
            
            // 计算下次重置时间
            let nextResetDate = new Date();
            nextResetDate.setDate(nextResetDate.getDate() + ((resetTime.day - nextResetDate.getDay() + 7) % 7));
            nextResetDate.setHours(resetTime.hour, resetTime.minute, 0, 0);
            
            // 如果今天就是重置日且时间已过，则设为下周
            if (nextResetDate <= currentDate) {
                nextResetDate.setDate(nextResetDate.getDate() + 7);
            }

            const lastResetDate = tracking.lastResetTime > 0 ? 
                new Date(tracking.lastResetTime * 1000).toLocaleString('zh-CN') : '从未重置';

            const message = [
                '📊 每周重置状态\n',
                `🔄 重置功能: ${config.weeklyReset.enabled ? '已启用' : '已禁用'}\n`,
                `📅 重置时间: 每${dayNames[resetTime.day]} ${resetTime.hour.toString().padStart(2, '0')}:${resetTime.minute.toString().padStart(2, '0')}\n`,
                `🕐 下次重置: ${nextResetDate.toLocaleString('zh-CN')}\n`,
                `📈 当前周数: 第${currentWeek}周\n`,
                `🔢 已重置次数: ${tracking.resetCount || 0}次\n`,
                `⏰ 上次重置: ${lastResetDate}\n`,
                `💾 保留数据: ${config.weeklyReset.preserveData.nickname ? '昵称' : '无'}\n`,
                `💰 重置身价: ${config.weeklyReset.preserveData.basicValue || 100}金币`
            ];

            return e.reply(message);

        } catch (error) {
            logger.error('[每周重置]查看状态时出错:', error);
            return e.reply(['查看重置状态时出错，请稍后再试']);
        }
    }

    // 手动执行重置（需要管理员权限）
    async manualReset(e) {
        try {
            // 检查权限（只有配置中的特殊用户或群主/管理员可以执行）
            if (!checkPermission(e) && e.member?.role !== 'owner' && e.member?.role !== 'admin') {
                return e.reply(['只有群主、管理员或特殊用户才能执行手动重置']);
            }

            const config = getConfig();
            if (!config.weeklyReset || !config.weeklyReset.enabled) {
                return e.reply(['每周重置功能未启用，无法执行手动重置']);
            }

            // 确认操作
            await e.reply(['⚠️ 警告：手动重置将清空所有玩家的游戏数据！']);
            await e.reply(['如果确认要执行，请在30秒内回复 "确认重置"']);

            const confirmMsg = await this.waitForConfirmation(e);
            if (!confirmMsg) {
                return e.reply(['操作已取消：超时未确认']);
            }

            if (confirmMsg.message !== '确认重置') {
                return e.reply(['操作已取消：确认信息不匹配']);
            }

            // 执行重置
            await e.reply(['开始执行手动重置，请稍等...']);
            
            const result = await performWeeklyReset();
            
            if (result.success) {
                // 先发送重置完成消息
                await e.reply([
                    '✅ 手动重置完成！\n',
                    `📊 重置统计:\n`,
                    `✅ 成功重置: ${result.resetCount}个玩家\n`,
                    `❌ 失败数量: ${result.errorCount}个\n`,
                    `⏰ 重置时间: ${new Date(result.resetTime * 1000).toLocaleString('zh-CN')}`
                ]);

                // 显示上周排行榜
                await this.showLastWeekRankings(e);
                
                return;
            } else {
                return e.reply([
                    '❌ 手动重置失败\n',
                    `错误信息: ${result.message}`
                ]);
            }

        } catch (error) {
            logger.error('[每周重置]手动重置时出错:', error);
            return e.reply(['手动重置时出错，请稍后再试']);
        }
    }

    // 等待用户确认
    async waitForConfirmation(e) {
        return new Promise((resolve) => {
            const timeout = setTimeout(() => {
                resolve(null);
            }, 30000); // 30秒超时

            const listener = (msg) => {
                if (msg.user_id === e.user_id && msg.group_id === e.group_id) {
                    clearTimeout(timeout);
                    resolve(msg);
                }
            };

            Bot.on('message', listener);
            
            // 清理监听器
            setTimeout(() => {
                Bot.off('message', listener);
            }, 30000);
        });
    }

    // 查看上周排行榜
    async lastWeekRanking(e) {
        try {
            if (!e.isGroup) return e.reply(['该功能只能在群内使用']);
            
            await this.showLastWeekRankings(e);
            
        } catch (error) {
            logger.error('[上周排行榜]查看时出错:', error);
            return e.reply(['查看上周排行榜时出错，请稍后再试']);
        }
    }

    // 显示上周排行榜的通用函数
    async showLastWeekRankings(e) {
        try {
            const groupId = e.group_id;
            const lastWeekData = getLastWeekRankingHistory(groupId);
            
            if (!lastWeekData) {
                return e.reply(['📊 暂无上周排行榜数据']);
            }

            const currentDate = new Date();
            const currentWeek = getWeekNumber(currentDate);
            
            // 发送标题信息
            await e.reply([
                `🏆 ${lastWeekData.year}年第${lastWeekData.week}周排行榜回顾\n`,
                `📅 重置时间: ${new Date(lastWeekData.weeklyResetTime * 1000).toLocaleString('zh-CN')}\n`,
                `👥 参与玩家: ${lastWeekData.playerCount}人\n`,
                `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`
            ]);

            // 延迟1秒后发送金币排行榜
            setTimeout(async () => {
                if (lastWeekData.currencyRanking && lastWeekData.currencyRanking.length > 0) {
                    const currencyMsg = formatRankingMessage(lastWeekData.currencyRanking, '上周金币排行榜');
                    await e.reply(currencyMsg);
                }
            }, 1000);

            // 延迟2秒后发送身价排行榜
            setTimeout(async () => {
                if (lastWeekData.valueRanking && lastWeekData.valueRanking.length > 0) {
                    const valueMsg = formatRankingMessage(lastWeekData.valueRanking, '上周身价排行榜');
                    await e.reply(valueMsg);
                }
            }, 2000);

            // 延迟3秒后发送奴隶排行榜
            setTimeout(async () => {
                if (lastWeekData.slaveRanking && lastWeekData.slaveRanking.length > 0) {
                    const slaveMsg = formatRankingMessage(lastWeekData.slaveRanking, '上周奴隶数量排行榜');
                    await e.reply(slaveMsg);
                }
            }, 3000);

            // 延迟4秒后发送银行排行榜
            setTimeout(async () => {
                if (lastWeekData.bankRanking && lastWeekData.bankRanking.length > 0) {
                    const bankMsg = formatRankingMessage(lastWeekData.bankRanking, '上周银行等级排行榜');
                    await e.reply(bankMsg);
                }
            }, 4000);

            // 延迟5秒后发送结尾消息
            setTimeout(async () => {
                await e.reply([
                    '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n',
                    '🎉 恭喜以上玩家在上周的精彩表现！\n',
                    '🔄 新的一周已经开始，继续加油吧！'
                ]);
            }, 5000);

        } catch (error) {
            logger.error('[显示上周排行榜]出错:', error);
            await e.reply(['显示上周排行榜时出错，请稍后再试']);
        }
    }

    // 重置帮助
    async resetHelp(e) {
        const helpMessage = [
            '📖 奴隶市场每周重置帮助\n',
            '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n',
            '🔄 每周重置功能说明:\n',
            '• 每周自动重置所有玩家的游戏数据\n',
            '• 默认重置时间：每周一 00:00\n',
            '• 重置前会自动备份所有数据\n',
            '• 重置后会自动显示上周排行榜\n\n',
            '📊 重置内容:\n',
            '• 金币归零\n',
            '• 清空奴隶列表和主人关系\n',
            '• 身价重置为初始值\n',
            '• 清除所有冷却时间\n',
            '• 重置银行等级和余额\n',
            '• 重置竞技排位等级\n',
            '• 保留昵称（可配置）\n\n',
            '🎮 相关指令:\n',
            '• #奴隶重置状态 - 查看重置系统状态\n',
            '• #手动奴隶重置 - 手动执行重置（需管理员权限）\n',
            '• #上周排行榜 - 查看上周各项排行榜\n',
            '• #奴隶重置帮助 - 显示此帮助信息\n\n',
            '🏆 排行榜功能:\n',
            '• 自动保存每周排行榜数据\n',
            '• 包含金币、身价、奴隶数量、银行等级排行\n',
            '• 重置后会自动展示上周成绩\n',
            '• 可随时查看上周排行榜回顾\n\n',
            '⚠️ 注意事项:\n',
            '• 重置操作不可逆转\n',
            '• 重置前数据会自动备份\n',
            '• 管理员可以关闭自动重置功能'
        ];

        return e.reply(helpMessage);
    }
}
